/**
 * Description: 面向块/缓冲区编程.
 *
 * <br>Buffer: 本身就是一块内存, 底层就是一个数组, 数据的读取都是通过 buffer 来实现 (数据先从 channel 到 buffer 中再进行读取).
 * Java 原生数据类型都有对应的 buffer 类型.
 * <br>Channel: 指的是可以向其写入数据或者从中读取的对象 (通过 buffer 进行), 类似 io 的 Stream. channel 是双向的 (与 io 的 Stream 不同).
 *
 * <pre>
 * thread -> selector (通过事件切换到 channel)
 * <span style="font-size:10">
 *
 *                    -> channel#1 -> buffer#1 (数据从 channel 读取到 buffer 中, 程序从 buffer 中读取数据)
 *                    -> channel#2 -> buffer#2
 *                    -> channel#3 -> buffer#3
 * </span>
 * </pre>
 *
 * The Reactor of Netty:
 * <pre>
 * <span style="font-size:10">
 *
 * +-----------+
 * | Client#01 +-+
 * +-----------+ |
 *               | +----------------------------------------+   +-----------------------------------------+
 * +-----------+ | |ParentGroup/BossGroup(NioEventLoopGroup)|   |ChildGroup/WorkerGroup(NioEventLoopGroup)|
 * | Client#02 +-+->                                        |   |                                         |
 * +-----------+ | |       Selector#accept(OP_ACCEPT)       |   |         Selector#accept(OP_READ)        |
 *               | +----------+------------------+----------+   +------------^----------------^-----------+
 * +-----------+ |            |                  |                           |                |
 * | Client#03 +-+     +------v------------------v------+                    |                |
 * +-----------+       |        SelectionKey(s)         |                    |                |
 *                     |                                +--------------------+----------------+
 *                     |SocketChannel(NioSocketChannel))|
 *                     +--------------------------------+
 *
 * </span>
 * </pre>
 *
 * @author LiKe
 * @date 2021-12-21 13:15
 * @see java.nio.channels.Selector
 * @see java.nio.channels.Channel
 * @see java.nio.Buffer
 */
package cn.caplike.demo.nio._2021;